#include "LinkList.h"

/**
在这里，由于typedef struct那已经将LinkList定义为指针类型
所以如果变量是：
LinkList *L，说是指向指针的指针，则LinkList p指针的赋值是 p = (*L);
LinkList L，则LinkList p指针的赋值是 p = L;
*/

// 初始化操作,建立一个空的线性表L
void InitList(LinkList *L){
	// LinkList *head = (LinkList**)malloc(sizeof(LinkList*));
	if(L==NULL){
		printf("初始化单链表失败，分配内存异常\n");
		return NULL;
	}
	(*L)->data = 0; 
	(*L)->next = NULL;
	// *head = &L;
	// return head;
	// return L;
} 	
//若线性表为空, 返回true, 否则返回false. 如果变量定义为L l, 则调用该方法为ListEmpty(*l);
bool ListEmpty(LinkList L){
	if(L->next!=NULL)
		return false;
	return true;
} 						
//将线性表清空., 如果变量定义为L *l, 则调用该方法为ClearList(l);
void ClearList(LinkList *L){
	LinkList p = *L;
	while(p->next!=NULL){
		LinkList temp = p->next;
		p->next = p->next->next;
		free(temp);
	}
} 						

//将线性表L中的第i个位置元素值返回给e,从坐标0开始.
void GetElem(LinkList L,int i,ElemType *e){
	int index = -1;
	LinkList p = L;
	while(p->next!=NULL&&index<i){
		p = p->next;
		index++; 
	}
	if(index!=i)
		return;
	*e = p->data;
}

//在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功; 否则,返回-1表示失败.
int LocateElem(LinkList L,ElemType e){
	int index = -1;
	LinkList p = L;
	while(p->next!=NULL){
		p = p->next;
		index++; 
		if(p->data == e)
			return index;
	}
	if(p->data != e)
		return -1; 
} 				

//在线性表L中的第i个位置插入新元素e,从坐标0开始.
void ListInsert(LinkList *L,int i,ElemType e){
	if(i<0)
		return;
	int index = -1;
	LinkList p = *L;
	while(p->next&&index<i-1){
		p = p->next;
		index++;  
	}
	if(index!=i-1)
		return;

	LinkList node = (LinkList)malloc(sizeof(Node));
	node->data = e;
	node->next = p->next;
	p->next = node;
}

//删除线性表L中第i个位置元素,并用e返回其值,从坐标0开始.
void ListDelete(LinkList *L,int i,ElemType *e){
	if(i<0)
		return;
	int index = -1;
	LinkList p = *L;
	while(p->next!=NULL&&index<i-1){
		p = p->next;
		index++;  
	}
	if(p->next!=NULL)
		p->next = p->next->next;
}

//返回线性表L的元素个数
int ListLength(LinkList L){
	int length = 0;
	LinkList p = L->next;
	while(p!=NULL){
		p = p->next;
		length++;
	}
	return length;
}

//释放内存
void ReleaseMemory(LinkList *L){
	LinkList p = *L;
	while(p->next!=NULL){
		LinkList temp = p->next;
		p->next = p->next->next;
		free(temp);
	}
	free(*L);
} 